home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / demos / spaceballscrktro / includes / prorunner.i < prev    next >
Encoding:
Text File  |  1980-01-04  |  40.5 KB  |  1,916 lines

  1. *****************************************
  2. *                    *
  3. * PRORUNNER V2.0            *
  4. * --------------            *
  5. * CODED BY COSMOS OF SANITY IN 1992    *
  6. *                    *
  7. *****************************************
  8. *                    *
  9. * Supporting the following effects:    *
  10. *                    *
  11. *    - Running with 68010/20/30/40    *
  12. *    - Using VBR-register        *
  13. *    - Packed/Normal PT-Moduleformat    *
  14. *    - Fade Sound in/out        *
  15. *    - Variable Musicfadespeed    *
  16. *    - Variable Interrupt-timing    *
  17. *    - Finetune            *
  18. *    - Normal play or Arpeggio    *
  19. *    - Slide Frequenz up        *
  20. *    - Slide    Frequenz down        *
  21. *    - Tone Portamento        *
  22. *    - Vibrato            *
  23. *    - Tone Portamento+Volume Slide    *
  24. *    - Vibrato + Volume Slide    *
  25. *    - Tremolo            *
  26. *    - Set SampleOffset        *
  27. *    - Volume Slide            *
  28. *    - Position Jump            *
  29. *    - Set Volume            *
  30. *    - Pattern Break            *
  31. *    - Set Speed            *
  32. * - E-Commands:                *
  33. *    - Set Filter            *
  34. *    - Fine Slide Up            *
  35. *    - Fine Slide Down        *
  36. *    - Glissando Control        *
  37. *    - Set Vibrato Waveform        *
  38. *    - Set Finetune            *
  39. *    - Set Loop / Jump to Loop    *
  40. *    - Set Tremolo Waveform        *
  41. *    - Retrig Note            *
  42. *    - Fine VolumeSlide Up        *
  43. *    - Fine VolumeSlide Down        *
  44. *    - NoteCut            *
  45. *    - NoteDelay            *
  46. *    - PatternDelay            *
  47. *    - FunkRepeat            *
  48. *                    *
  49. *****************************************
  50.  
  51. YES                EQU    1
  52. NO                EQU    0
  53. INCLUDEFADINGROUTINE        EQU    YES
  54. PACKEDSONGFORMAT        EQU    NO
  55. FADINGSTEPS            EQU    5    ; ( 0< FADINGSTEPS <9 )
  56. MAXVOLUME            EQU    1<<FADINGSTEPS
  57. INTERRUPTTIME            EQU    $180
  58.  
  59. SAMPLELENGTHOFFSET        EQU    4
  60. SAMPLEVOLUMEOFFSET        EQU    6
  61. SAMPLEREPEATPOINTOFFSET        EQU    8
  62. SAMPLEWITHLOOP            EQU    12
  63. SAMPLEREPEATLENGTHOFFSET    EQU    14
  64. SAMPLEFINETUNEOFFSET        EQU    16
  65.  
  66. * Init-Routine *******************************************************
  67.  
  68. pr_init:
  69.     lea    pr_framecounter(pc),a6
  70.     move.w    #$7fff,pr_oldledvalue-pr_framecounter(a6)
  71.     move.l    pr_module(pc),a0
  72.     cmp.l    #0,a0
  73.     bne.s    pr_init1
  74.     rts
  75. pr_init1:
  76.     IFEQ    PACKEDSONGFORMAT-YES
  77.     cmp.l    #'SNT!',(a0)
  78.     beq.s    pr_init2
  79.     ELSE
  80.     cmp.l    #'M.K.',1080(a0)
  81.     beq.s    pr_init2
  82.     cmp.l    #'SNT.',1080(a0)
  83.     beq.s    pr_init2
  84.     ENDC
  85.     rts
  86. pr_init2:
  87.     IFEQ    PACKEDSONGFORMAT-YES
  88.     lea    8(a0),a1
  89.     ELSE
  90.     lea    20(a0),a1
  91.     ENDC
  92.     lea    pr_Sampleinfos(pc),a2
  93.     moveq.l    #32,d7
  94.     moveq    #30,d0
  95. pr_init3:
  96.     IFNE    PACKEDSONGFORMAT-YES
  97.     lea    22(a1),a1        ; Samplenamen überspringen
  98.     ENDC
  99.     move.w    (a1)+,SAMPLELENGTHOFFSET(a2)    ; Samplelength in Words
  100.     lea    pr_periods(pc),a3
  101.     moveq    #$f,d2
  102.     and.b    (a1)+,d2        ; Finetuning
  103.     mulu.w    #36*2,d2
  104.     add.l    d2,a3
  105.     move.l    a3,SAMPLEFINETUNEOFFSET(a2)
  106.     moveq    #0,d1
  107.     move.b    (a1)+,d1
  108.     move.w    d1,SAMPLEVOLUMEOFFSET(a2)    ; Volume
  109.     moveq.l    #0,d1
  110.     move.w    (a1)+,d1        ; Repeatpoint in Bytes
  111.     add.l    d1,d1
  112.     move.l    d1,SAMPLEREPEATPOINTOFFSET(a2)
  113.     move.w    (a1)+,d1
  114.     clr.w    SAMPLEWITHLOOP(a2)
  115.     cmp.w    #1,d1
  116.     bls.s    pr_init3_2
  117.     addq.w    #1,SAMPLEWITHLOOP(a2)
  118. pr_init3_2:
  119.     move.w    d1,SAMPLEREPEATLENGTHOFFSET(a2)    ; Repeatlength
  120.     add.l    d7,a2
  121.     dbf    d0,pr_init3
  122.  
  123.     moveq    #0,d0
  124.     IFEQ    PACKEDSONGFORMAT-YES
  125.     move.b    256(a0),d0
  126.     ELSE
  127.     move.b    950(a0),d0        ; Number of patterns
  128.     ENDC
  129.     subq.w    #1,d0
  130.     move.w    d0,pr_highestpattern-pr_framecounter(a6)
  131.     moveq.l    #0,d1
  132.     lea    pr_Patternpositions(pc),a3
  133.     IFEQ    PACKEDSONGFORMAT-YES
  134.     lea    258(a0),a1        ; 1.Patternpos
  135.     lea    770(a0),a2        ; 1.Patterndata
  136.     lea    642(a0),a4        ; 1.Patternoffset
  137. pr_init4:
  138.     moveq.l    #0,d2
  139.     move.b    (a1)+,d2
  140.     add.w    d2,d2
  141.     move.w    (a4,d2.w),d2
  142.     add.l    a2,d2
  143.     move.l    d2,(a3)+
  144.     dbf    d0,pr_init4
  145.     ELSE
  146.     lea    952(a0),a1        ; 1. Patternpos
  147.     lea    1084(a0),a2        ; 1. Patterndata
  148. pr_init4:
  149.     move.b    (a1)+,d2        ; x. Patternpos
  150.     moveq.l    #0,d3
  151.     move.b    d2,d3
  152.     mulu.w    #1024,d3
  153.     add.l    a2,d3
  154.     move.l    d3,(a3)+
  155.     dbf    d0,pr_init4
  156.     ENDC
  157.  
  158.     IFEQ    PACKEDSONGFORMAT-YES
  159.     move.l    4(a0),d2
  160.     add.l    a0,d2
  161.     ELSE
  162.     lea    952(a0),a1
  163.     moveq.l    #0,d1
  164.     moveq    #127,d0
  165. pr_init4_1:
  166.     move.b    (a1)+,d2
  167.     cmp.b    d1,d2            ; Highest Pattern ?
  168.     bls.s    pr_init4_2
  169.     move.b    d2,d1
  170. pr_init4_2:
  171.     dbf    d0,pr_init4_1
  172.     addq.w    #1,d1
  173.     move.l    a0,d2
  174.     mulu.w    #1024,d1        ; Highest Pattern * 1024 Bytes
  175.     add.l    #1084,d2
  176.     add.l    d1,d2
  177.     ENDC
  178.     lea    pr_Sampleinfos(pc),a3
  179.     lea    pr_Sampleinfos+SAMPLELENGTHOFFSET(pc),a2
  180.     moveq.l    #32,d7
  181.     move.l    d2,(a3)
  182.     moveq    #29,d0
  183. pr_init4_3:
  184.     move.l    (a3),d1
  185.     add.l    d7,a3
  186.     moveq.l    #0,d2
  187.     move.w    (a2),d2
  188.     add.l    d7,a2
  189.     add.l    d2,d2
  190.     add.l    d2,d1
  191.     move.l    d1,(a3)
  192.     dbf    d0,pr_init4_3
  193.  
  194.     lea    pr_Sampleinfos(pc),a2
  195.     lea    pr_Sampleinfos+SAMPLEREPEATPOINTOFFSET(pc),a3
  196.     moveq.l    #32,d7
  197.     moveq    #30,d0
  198. pr_init4_4:
  199.     move.l    (a2),d1
  200.     add.l    d1,(a3)
  201.     add.l    d7,a2
  202.     add.l    d7,a3
  203.     dbf    d0,pr_init4_4
  204.     
  205.     IFNE    PACKEDSONGFORMAT-YES
  206.     
  207.     cmp.l    #'SNT.',1080(a0)
  208.     beq.s    pr_init7
  209.     
  210.     lea    1084(a0),a1
  211.     move.l    pr_Sampleinfos(pc),a2
  212.     move.b    #$f0,d6
  213.     move.w    #$fff,d7
  214. pr_init5:
  215.     move.b    (a1),d0
  216.     move.b    2(a1),d1
  217.     move.w    (a1),d2
  218.     and.w    d7,2(a1)
  219.     and.w    d7,d2
  220.     
  221.     and.b    d6,d0
  222.     lsr.b    #4,d1
  223.     or.b    d1,d0
  224.     move.b    d0,(a1)
  225.     
  226.     tst.w    d2
  227.     beq.s    pr_init5_3
  228.     lea    pr_periods(pc),a4
  229.     moveq    #0,d1
  230. pr_init5_2:
  231.     addq.w    #1,d1
  232.     cmp.w    (a4)+,d2
  233.     bne.s    pr_init5_2
  234.     move.b    d1,1(a1)
  235. pr_init5_3:
  236.     cmp.b    #$d,2(a1)
  237.     bne.s    pr_init5_4
  238.  
  239.     moveq    #0,d1
  240.     move.b    3(a1),d1
  241.     moveq    #$f,d2
  242.     and.w    d1,d2
  243.     lsr.w    #4,d1
  244.     mulu.w    #10,d1
  245.     add.w    d2,d1
  246.     cmp.b    #63,d1
  247.     bls.s    pr_init5_3_2
  248.     moveq    #63,d1
  249. pr_init5_3_2:
  250.     move.b    d1,3(a1)
  251. pr_init5_4:
  252.     addq.l    #4,a1
  253.     cmp.l    a2,a1
  254.     blt.s    pr_init5    
  255.  
  256.     move.l    #'SNT.',1080(a0)
  257.  
  258.     ENDC
  259.     
  260. pr_init7:
  261.     lea    pr_Arpeggiofastlist(pc),a2
  262.     lea    pr_Arpeggiofastlistperiods(pc),a1
  263.     lea    35*2(a1),a1        ; to the end of list...
  264.     moveq    #0,d0
  265.     moveq    #35,d1
  266.     move.w    #999,d2
  267.     moveq    #0,d6
  268. pr_init8:
  269.     move.w    -(a1),d7
  270.     addq.w    #1,d6
  271. pr_init8_2:
  272.     cmp.w    d7,d0
  273.     blt.s    pr_init8_4
  274.     subq.w    #1,d1
  275.     tst.b    d1
  276.     bne.s    pr_init8
  277. pr_init8_3:
  278.     move.b    d1,(a2)+
  279.     dbf    d2,pr_init8_3
  280.     bra.s    pr_init8_5    
  281. pr_init8_4:
  282.     move.b    d1,(a2)+
  283.     addq.w    #1,d0
  284.     dbf    d2,pr_init8_2
  285. pr_init8_5:
  286.  
  287.     lea    pr_Channel0(pc),a1
  288.     move.w    #1,pr_Channel1-pr_Channel0(a1)
  289.     move.w    #1,pr_Channel2-pr_Channel0(a1)
  290.     move.w    #1,pr_Channel3-pr_Channel0(a1)
  291.     move.w    #1,(a1)+
  292.     moveq    #(pr_Channel1-pr_Channel0)/2-2,d0
  293. pr_init9_2:
  294.     clr.w    pr_Channel1-pr_Channel0(a1)
  295.     clr.w    pr_Channel2-pr_Channel0(a1)
  296.     clr.w    pr_Channel3-pr_Channel0(a1)
  297.     clr.w    (a1)+
  298.     dbf    d0,pr_init9_2
  299.  
  300.     lea    pr_fastperiodlist(pc),a1
  301.     lea    pr_periods(pc),a2
  302.     move.l    a2,(a1)
  303.     moveq.l    #36*2,d1
  304.     moveq    #14,d0
  305. pr_init9_3:
  306.     move.l    (a1)+,d2
  307.     add.l    d1,d2
  308.     move.l    d2,(a1)
  309.     dbf    d0,pr_init9_3
  310.         
  311.     lea    pr_Arpeggiofastdivisionlist(pc),a1
  312.     moveq    #0,d1
  313.     move.w    #$ff,d0
  314. pr_init9_4:
  315.     move.b    d1,(a1)+
  316.     subq.b    #1,d1
  317.     bpl.s    pr_init9_4_2
  318.     moveq    #2,d1
  319. pr_init9_4_2:
  320.     dbf    d0,pr_init9_4
  321.     
  322.     move.w    #6,pr_speed-pr_framecounter(a6)
  323.     move.w    pr_speed(pc),(a6)
  324.     clr.w    pr_Patternct-pr_framecounter(a6)
  325.     move.w    pr_highestpattern(pc),d0
  326.     move.w    pr_startposition(pc),d1
  327.     blt.s    pr_init9_5
  328.     cmp.w    d0,d1
  329.     bls.s    pr_init9_5_2
  330. pr_init9_5:
  331.     clr.w    pr_startposition-pr_framecounter(a6)
  332. pr_init9_5_2:
  333.     move.w    pr_startposition(pc),pr_currentpattern-pr_framecounter(a6)
  334.     
  335.     lea    pr_Patternpositions(pc),a3
  336.     move.l    a3,d0
  337.     moveq.l    #0,d1
  338.     move.w    pr_startposition(pc),d1
  339.     lsl.l    #2,d1
  340.     add.l    d1,d0
  341.     move.l    d0,pr_Patternpt-pr_framecounter(a6)
  342.     move.l    pr_Patternpt(pc),a5
  343.     move.l    (a5),pr_Currentposition-pr_framecounter(a6)
  344.     
  345.     lea    $dff000,a5
  346.     lea    $bfd000,a0
  347.     move.w    #$2000,d0
  348.     move.w    d0,$9a(a5)
  349.     move.w    d0,$9c(a5)
  350.     
  351.     lea    pr_int(pc),a1
  352.     move.l    pr_Vectorbasept(pc),a3
  353.     move.l    a1,$78(a3)
  354.  
  355.     move.b    #$7f,$d00(a0)
  356.     move.b    #$08,$e00(a0)
  357.     move.w    #INTERRUPTTIME,d0
  358.     move.b    d0,$400(a0)
  359.     lsr.w    #8,d0
  360.     move.b    d0,$500(a0)
  361. pr_init10:
  362.     btst    #0,$bfdd00
  363.     beq.s    pr_init10
  364.     move.b    #$81,$d00(a0)
  365.     move.w    #$2000,$9c(a5)
  366.     move.w    #$a000,$9a(a5)
  367.     move.w    #$f,$96(a5)
  368.     move.w    #$8000,pr_dmacon-pr_framecounter(a6)
  369.     clr.w    $a8(a5)
  370.     clr.w    $b8(a5)
  371.     clr.w    $c8(a5)
  372.     clr.w    $d8(a5)
  373.     moveq    #0,d0
  374.     move.b    $bfe001,d0
  375.     move.w    d0,pr_oldledvalue-pr_framecounter(a6)
  376.     bset    #1,$bfe001
  377.     rts
  378.  
  379. * End-Routine *********************************************************
  380.  
  381. pr_end:
  382.     lea    $dff000,a5
  383.     move.w    #$f,$96(a5)
  384.     clr.w    $a8(a5)
  385.     clr.w    $b8(a5)
  386.     clr.w    $c8(a5)
  387.     clr.w    $d8(a5)
  388.     move.w    #$2000,$9a(a5)
  389.     move.w    pr_oldledvalue(pc),d0
  390.     cmp.w    #$7fff,d0
  391.     beq.s    pr_end3
  392.     btst    #1,d0
  393.     beq.s    pr_end2
  394.     bset    #1,$bfe001
  395.     rts
  396. pr_end2:
  397.     bclr    #1,$bfe001
  398. pr_end3:
  399.     rts
  400.  
  401. * Music-Fading ********************************************************
  402.  
  403.     IFEQ    INCLUDEFADINGROUTINE-YES
  404. pr_fademusic:    macro
  405.     lea    pr_musicfadect(pc),a0
  406.     move.w    pr_musicfadedirection(pc),d0
  407.     add.w    d0,(a0)
  408.     cmp.w    #MAXVOLUME,(a0)
  409.     bls.s    pr_fademusicend
  410.     bgt.s    pr_fademusictoohigh
  411.     clr.w    (a0)
  412.     clr.w    pr_musicfadedirection-pr_musicfadect(a0)
  413.     rts
  414. pr_fademusictoohigh:
  415.     move.w    #MAXVOLUME,(a0)
  416.     clr.w    pr_musicfadedirection-pr_musicfadect(a0)
  417. pr_fademusicend:
  418.     endm
  419.  
  420. pr_musicfadect:        dc.w    MAXVOLUME
  421. pr_musicfadedirection:    dc.w    0
  422.     ENDC
  423.     
  424. * MACROS **************************************************************
  425.  
  426. pr_playchannel:    macro                ; do not change: d7,a2-a6
  427.         moveq    #0,d2
  428.         moveq    #0,d0
  429.         moveq    #0,d1
  430.         IFEQ    PACKEDSONGFORMAT-YES
  431.         move.b    (a6),d6
  432.         bpl.s    .pr_playchannel1
  433.         btst    #6,d6
  434.         bne.s    .pr_playchannel0
  435.         subq.l    #2,a6
  436.         clr.w    4(a4)
  437.         bra.s    .pr_playchannelend
  438. .pr_playchannel0:        
  439.         subq.l    #2,a6
  440.         move.b    56(a4),d0
  441.         move.b    57(a4),d1
  442.         move.b    58(a4),d2
  443.         move.w    58(a4),4(a4)
  444.         bra.s    .pr_playchanneljump        
  445. .pr_playchannel1:
  446.         moveq    #$f,d0
  447.         and.b    1(a6),d0
  448.         move.b    d0,4(a4)
  449.         move.b    d0,d2
  450.         move.b    2(a6),5(a4)
  451.         move.w    4(a4),58(a4)
  452.         
  453.         moveq    #1,d0
  454.         and.b    (a6),d0
  455.         move.b    1(a6),d1
  456.         lsr.b    #3,d1
  457.         bclr    #0,d1
  458.         or.b    d1,d0
  459.         move.b    d0,56(a4)        
  460.  
  461.         move.b    (a6),d1
  462.         lsr.b    #1,d1
  463.         move.b    d1,57(a4)
  464.         ELSE
  465.         move.w    2(a6),4(a4)
  466.         move.b    2(a6),d2
  467.         move.b    (a6),d0
  468.         move.b    1(a6),d1
  469.         ENDC
  470. .pr_playchanneljump:
  471.         add.w    d2,d2
  472.         lea    pr_playchannellist(pc),a0
  473.         move.w    (a0,d2.w),d2
  474.         jsr    (a0,d2.w)
  475. .pr_playchannelend:
  476.         IFEQ    PACKEDSONGFORMAT-YES
  477.         addq.l    #3,a6
  478.         ELSE
  479.         addq.l    #4,a6
  480.         ENDC
  481.         endm
  482.  
  483. pr_checkchannel:    macro            ; do not change: d7,a2-a6
  484.         bsr.w    pr_checkfunkrepeat
  485.         moveq    #0,d0
  486.         move.b    4(a4),d0
  487.         add.b    d0,d0
  488.         lea    pr_Effectchecklist(pc),a0
  489.         move.w    (a0,d0.w),d0
  490.         jsr    (a0,d0.w)
  491.         endm
  492.         
  493. pr_copyplayvalues:    macro
  494.         tst.w    pr_commandnotedelay-pr_framecounter(a2)
  495.         bne.s    .pr_copyplayvalues2
  496.         move.w    2(a4),6(a3)
  497. .pr_copyplayvalues2:
  498.         IFEQ    INCLUDEFADINGROUTINE-YES
  499.         move.w    12(a4),d0
  500.         mulu.w    pr_musicfadect-pr_framecounter(a2),d0
  501.          lsr.l    #FADINGSTEPS,d0
  502.         move.w    d0,8(a3)
  503.         ELSE
  504.         move.w    12(a4),8(a3)
  505.         ENDC
  506.         endm
  507.  
  508. * Music-Routine *******************************************************
  509.  
  510. pr_music:
  511.     IFEQ    INCLUDEFADINGROUTINE-YES
  512.     pr_fademusic
  513.     ENDC
  514.     lea    $dff000,a5
  515.  
  516.     lea    pr_framecounter(pc),a2
  517.     subq.w    #1,(a2)
  518.     beq.s    pr_music2
  519.     bra.w    pr_checkeffects
  520. pr_music2:
  521.     cmp.b    #1,pr_patterndelaytime-pr_framecounter+1(a2)
  522.     blt.s    pr_music2_2
  523.     bsr.w    pr_checkeffects
  524.     bra.w    pr_music2_9
  525. pr_music2_2:
  526.     move.l    pr_Currentposition(pc),a6
  527.     lea    pr_Channel0(pc),a4
  528.     lea    $a0(a5),a3
  529.     moveq    #1,d7
  530.     pr_playchannel
  531.     pr_copyplayvalues
  532. pr_music2_3:    
  533.     lea    pr_Channel1(pc),a4
  534.     lea    $b0(a5),a3
  535.     moveq    #2,d7
  536.     pr_playchannel
  537.     pr_copyplayvalues
  538. pr_music2_4:
  539.     lea    pr_Channel2(pc),a4
  540.     lea    $c0(a5),a3
  541.     moveq    #4,d7
  542.     pr_playchannel
  543.     pr_copyplayvalues
  544. pr_music2_5:
  545.     lea    pr_Channel3(pc),a4
  546.     lea    $d0(a5),a3
  547.     moveq    #8,d7
  548.     pr_playchannel
  549.     pr_copyplayvalues
  550.     
  551.     lea    pr_int(pc),a0
  552.     move.l    pr_Vectorbasept(pc),a1
  553.     move.l    a0,$78(a1)
  554.     move.b    #$19,$bfde00
  555.  
  556. pr_music2_9:
  557.     move.w    pr_speed(pc),(a2)
  558.     tst.w    pr_patternhasbeenbreaked-pr_framecounter(a2)
  559.     bne.s    pr_music3
  560.     tst.w    pr_patterndelaytime-pr_framecounter(a2)
  561.     beq.s    pr_music3_1
  562.     subq.w    #1,pr_patterndelaytime-pr_framecounter(a2)
  563.     beq.s    pr_music3_1
  564.     bra.s    pr_nonextpattern
  565. pr_music3:
  566.     clr.w    pr_patternhasbeenbreaked-pr_framecounter(a2)
  567.     tst.w    pr_patterndelaytime-pr_framecounter(a2)
  568.     beq.s    pr_music3_1
  569.     subq.w    #1,pr_patterndelaytime-pr_framecounter(a2)
  570. pr_music3_1:
  571.     lea    pr_Patternct(pc),a1
  572.     tst.w    pr_dontcalcnewposition-pr_framecounter(a2)
  573.     bne.s    pr_music3_2
  574.     move.l    a6,pr_Currentposition-pr_framecounter(a2)
  575.     addq.w    #1,(a1)
  576. pr_music3_2:
  577.     clr.w    pr_dontcalcnewposition-pr_framecounter(a2)
  578.     moveq.l    #64,d1
  579.     cmp.w    (a1),d1
  580.     bgt.s    pr_nonextpattern
  581.     sub.w    d1,(a1)
  582.     lea    pr_currentpattern(pc),a0
  583.     move.w    (a1),d1
  584.     beq.s    pr_music3_3
  585.     IFEQ    PACKEDSONGFORMAT-YES
  586.     move.l    pr_module(pc),a1
  587.     lea    386(a1),a1
  588.     move.w    (a0),d1
  589.     add.w    d1,d1
  590.     move.w    (a1,d1.w),d1
  591.     ELSE
  592.     lsl.w    #4,d1
  593.     ENDC
  594. pr_music3_3:
  595.     addq.l    #4,pr_Patternpt-pr_framecounter(a2)
  596.     addq.w    #1,(a0)
  597.     move.w    (a0),d0
  598.     cmp.w    pr_highestpattern-pr_framecounter(a2),d0
  599.     bls.s    pr_nohighestpattern
  600.     lea    pr_Patternpositions(pc),a1
  601.     move.l    a1,pr_Patternpt-pr_framecounter(a2)
  602.     clr.w    (a0)
  603. pr_nohighestpattern:
  604.     move.l    pr_Patternpt-pr_framecounter(a2),a6
  605.     move.l    (a6),d0
  606.     add.l    d1,d0
  607.     move.l    d0,pr_Currentposition-pr_framecounter(a2)
  608. pr_nonextpattern:
  609.     rts
  610.  
  611.     
  612. pr_int:
  613.     tst.b    $bfdd00
  614.     move.b    #$19,$bfde00
  615.     move.w    pr_dmacon(pc),$dff096
  616.     move.w    #$2000,$dff09c
  617.     move.l    a0,-(sp)
  618.     move.l    pr_Vectorbasept(pc),a0
  619.     add.l    #pr_int2-pr_int,$78(a0)
  620.     move.l    (sp)+,a0
  621.     rte
  622.  
  623. pr_int2:
  624.     tst.b    $bfdd00
  625.     movem.l    a5-a6,-(sp)
  626.     lea    $dff000,a5
  627.     lea    pr_Channel0+6(pc),a6
  628.     move.l    (a6),$a0(a5)
  629.     move.w    4(a6),$a4(a5)
  630.     move.l    pr_Channel1-pr_Channel0(a6),$b0(a5)
  631.     move.w    4+pr_Channel1-pr_Channel0(a6),$b4(a5)
  632.     move.l    pr_Channel2-pr_Channel0(a6),$c0(a5)
  633.     move.w    4+pr_Channel2-pr_Channel0(a6),$c4(a5)
  634.     move.l    pr_Channel3-pr_Channel0(a6),$d0(a5)
  635.     move.w    4+pr_Channel3-pr_Channel0(a6),$d4(a5)
  636.     move.w    #$2000,$9c(a5)
  637.     move.l    pr_Vectorbasept(pc),a6
  638.     move.l    pr_old78(pc),$78(a6)
  639.     movem.l    (sp)+,a5-a6
  640.     rte
  641.         
  642. pr_playchannellist:
  643.     dc.w    pr_playnormalchannel-pr_playchannellist        ; 0
  644.     dc.w    pr_playnormalchannel-pr_playchannellist        ; 1
  645.     dc.w    pr_playnormalchannel-pr_playchannellist        ; 2
  646.     dc.w    pr_playtpchannel-pr_playchannellist        ; 3
  647.     dc.w    pr_playnormalchannel-pr_playchannellist        ; 4
  648.     dc.w    pr_playtpchannel-pr_playchannellist        ; 5
  649.     dc.w    pr_playnormalchannel-pr_playchannellist        ; 6
  650.     dc.w    pr_playnormalchannel-pr_playchannellist        ; 7
  651.     dc.w    pr_playnormalchannel-pr_playchannellist        ; 8
  652.     dc.w    pr_playsochannel-pr_playchannellist        ; 9
  653.     dc.w    pr_playnormalchannel-pr_playchannellist        ; A
  654.     dc.w    pr_playnormalchannel-pr_playchannellist        ; B
  655.     dc.w    pr_playnormalchannel-pr_playchannellist        ; C
  656.     dc.w    pr_playnormalchannel-pr_playchannellist        ; D
  657.     dc.w    pr_playnormalchannel-pr_playchannellist        ; E
  658.     dc.w    pr_playnormalchannel-pr_playchannellist        ; F
  659.     
  660. * KANAL NORMAL SPIELEN ************************************************
  661.  
  662. pr_playnormalchannel:
  663.     lea    pr_Sampleinfos(pc),a0
  664.     lea    (a0),a1
  665.     lea    SAMPLEFINETUNEOFFSET(a1),a1
  666.     clr.w    pr_commandnotedelay-pr_framecounter(a2)
  667.     moveq    #-1,d4
  668.     lsl.w    #4,d4
  669.     and.w    4(a4),d4
  670.     cmp.w    #$ed0,d4
  671.     bne.s    pr_playnormalsamplenotedelay
  672.     addq.w    #1,pr_commandnotedelay-pr_framecounter(a2)
  673. pr_playnormalsamplenotedelay:
  674.     tst.b    d0
  675.     beq.w    pr_playnormalnonewsample    ; Irgendein Sample ?
  676.     move.w    d0,(a4)                ; Trage Samplenummer ein
  677.     tst.b    d1
  678.     bne.s    pr_playnormalsample
  679.     subq.b    #1,d0
  680.     lsl.l    #5,d0
  681.     add.l    d0,a0
  682.     addq.l    #6,a0
  683.     move.w    (a0)+,12(a4)
  684.     move.l    (a0)+,d2
  685.     move.l    d2,6(a4)
  686.     tst.w    (a0)+
  687.     beq.s    pr_playnormalchannel2
  688.     move.l    d2,36(a4)
  689.     move.l    d2,40(a4)
  690. pr_playnormalchannel2:
  691.     move.w    (a0)+,10(a4)
  692.     bra.w    pr_playnormalnonewperiod
  693. pr_playnormalsample:
  694.     or.w    d7,pr_dmacon-pr_framecounter(a2)
  695.     tst.w    pr_commandnotedelay-pr_framecounter(a2)
  696.     beq.w    pr_playnormalsamplenoedcom
  697.     subq.b    #1,d0
  698.     lsl.l    #5,d0
  699.     add.l    d0,a0
  700.     move.w    6(a0),12(a4)
  701.     move.l    8(a0),6(a4)
  702.     move.w    14(a0),10(a4)
  703.     bra.s    pr_playnormalnewperiod
  704. pr_playnormalsamplenoedcom:
  705.     move.w    d7,$96(a5)
  706.     subq.b    #1,d0
  707.     lsl.l    #5,d0
  708.     add.l    d0,a0
  709.     move.l    (a0)+,(a3)        ; Setze Samplestart
  710.     move.w    (a0)+,4(a3)        ; Setze Audiodatenlänge
  711.     move.w    (a0)+,12(a4)        ; Setze Samplelautstärke
  712.     move.l    (a0)+,d2
  713.     move.l    d2,6(a4)        ; Samplerepeatpoint eintragen
  714.     tst.w    (a0)+
  715.     beq.s    pr_playnormalsample2
  716.     move.l    d2,36(a4)
  717.     move.l    d2,40(a4)
  718. pr_playnormalsample2:
  719.     move.w    (a0)+,10(a4)        ; Samplerepeatlength eintragen
  720.     bra.s    pr_playnormalnewperiod
  721. pr_playnormalnonewsample:
  722.     clr.l    14(a4)
  723.     tst.b    d1
  724.     beq.s    pr_playnormalnonewperiod    ; Irgend ne neue Frequenz ?
  725.     move.w    (a4),d0            ; Alte Samplenummer holen
  726.     or.w    d7,pr_dmacon-pr_framecounter(a2)
  727.     tst.w    pr_commandnotedelay-pr_framecounter(a2)
  728.     bne.s    pr_playnormalnewperiod
  729.     move.w    d7,$96(a5)
  730. pr_playnormalnonewsamplenoedcom:
  731.     subq.b    #1,d0
  732.     lsl.l    #5,d0
  733.     add.l    d0,a0
  734.     move.l    (a0)+,(a3)        ; Setze Samplestart
  735.     move.w    (a0)+,4(a3)        ; Setze Audiodatenlänge
  736.     addq.l    #2,a0
  737.     move.l    (a0)+,d2
  738.     move.l    d2,6(a4)        ; Samplerepeatpoint eintragen
  739.     tst.w    (a0)+
  740.     beq.s    pr_playnormalnonewsample2
  741.     move.l    d2,36(a4)
  742.     move.l    d2,40(a4)
  743. pr_playnormalnonewsample2:
  744.     move.w    (a0)+,10(a4)        ; Samplerepeatlength eintragen
  745. pr_playnormalnewperiod:
  746.     subq.b    #1,d1
  747.     add.b    d1,d1
  748.     move.w    (a4),d0
  749.     subq.b    #1,d0
  750.     lsl.w    #5,d0
  751.     move.l    (a1,d0.w),a1
  752.     move.w    (a1,d1.w),2(a4)        ; Frequenz eintragen
  753. pr_playnormalnonewperiod:
  754.     bra.w    pr_playeffect
  755.  
  756. * KANAL MIT OFFSET SPIELEN *********************************************
  757.  
  758. pr_playsochannel:
  759.     lea    pr_Sampleinfos(pc),a0
  760.     lea    (a0),a1
  761.     lea    SAMPLEFINETUNEOFFSET(a1),a1
  762.     tst.b    d0
  763.     beq.w    pr_playsononewsample    ; Irgendein Sample ?
  764.     move.w    d0,(a4)                ; Trage Samplenummer ein
  765.     tst.b    d1
  766.     bne.s    pr_playsosample
  767.     subq.b    #1,d0
  768.     lsl.l    #5,d0
  769.     add.l    d0,a0
  770.     addq.l    #6,a0
  771.     move.w    (a0)+,12(a4)
  772.     move.l    (a0)+,d2
  773.     move.l    d2,6(a4)
  774.     tst.w    (a0)+
  775.     beq.s    pr_playsochannel2
  776.     move.l    d2,36(a4)
  777.     move.l    d2,40(a4)
  778. pr_playsochannel2:
  779.     move.w    (a0)+,10(a4)
  780.     bra.w    pr_playsononewperiod
  781. pr_playsosample:
  782.     move.w    d7,$96(a5)
  783.     or.w    d7,pr_dmacon-pr_framecounter(a2)
  784.     moveq.l    #0,d6
  785.     move.b    5(a4),d6
  786.     lsl.w    #7,d6
  787.     subq.b    #1,d0
  788.     lsl.l    #5,d0
  789.     add.l    d0,a0
  790.     move.l    (a0)+,d2
  791.     move.w    (a0)+,d3
  792.     cmp.w    d3,d6
  793.     bge.s    pr_playsosample2
  794.     sub.w    d6,d3
  795.     add.l    d6,d6
  796.     add.l    d6,d2
  797.     move.l    d2,(a3)            ; Setze Samplestart
  798.     move.w    d3,4(a3)        ; Setze Audiodatenlänge
  799.     move.w    (a0)+,12(a4)        ; Setze Samplelautstärke
  800.     move.l    (a0)+,d2
  801.     move.l    d2,6(a4)        ; Samplerepeatpoint eintragen
  802.     tst.w    (a0)+
  803.     beq.s    pr_playsosample1
  804.     move.l    d2,36(a4)
  805.     move.l    d2,40(a4)
  806. pr_playsosample1:
  807.     move.w    (a0)+,10(a4)        ; Samplerepeatlength eintragen
  808.     bra.w    pr_playsonewperiod
  809. pr_playsosample2:
  810.     move.w    (a0)+,12(a4)
  811.     move.l    (a0),(a3)
  812.     move.w    4(a0),4(a3)
  813.     move.l    (a0)+,d2
  814.     move.l    d2,6(a4)
  815.     tst.w    (a0)+
  816.     beq.s    pr_playsosample4
  817.     move.l    d2,36(a4)
  818.     move.l    d2,40(a4)
  819. pr_playsosample4:
  820.     move.w    (a0)+,10(a4)
  821.     bra.s    pr_playsonewperiod
  822. pr_playsononewsample:
  823.     clr.l    14(a4)
  824.     tst.b    d1
  825.     beq.b    pr_playsononewperiod    ; Irgend ne neue Frequenz ?
  826.     move.w    (a4),d0            ; Alte Samplenummer holen
  827.     move.w    d7,$96(a5)
  828.     or.w    d7,pr_dmacon-pr_framecounter(a2)
  829.     moveq.l    #0,d6
  830.     move.b    5(a4),d6
  831.     lsl.w    #7,d6
  832.     subq.b    #1,d0
  833.     lsl.l    #5,d0
  834.     add.l    d0,a0
  835.     move.l    (a0)+,d2
  836.     move.w    (a0)+,d3
  837.     cmp.w    d3,d6
  838.     bge.s    pr_playsosample3
  839.     sub.w    d6,d3
  840.     add.l    d6,d6
  841.     add.l    d6,d2
  842.     move.l    d2,(a3)            ; Setze Samplestart
  843.     move.w    d3,4(a3)        ; Setze Audiodatenlänge
  844.     addq.l    #2,a0
  845.     move.l    (a0)+,d2
  846.     move.l    d2,6(a4)        ; Samplerepeatpoint eintragen
  847.     tst.w    (a0)+
  848.     beq.s    pr_playsononewsample2
  849.     move.l    d2,36(a4)
  850.     move.l    d2,40(a4)
  851. pr_playsononewsample2:
  852.     move.w    (a0)+,10(a4)        ; Samplerepeatlength eintragen
  853.     bra.s    pr_playsonewperiod
  854. pr_playsosample3:
  855.     addq.l    #2,a0
  856.     move.l    (a0),(a3)
  857.     move.w    4(a0),4(a3)
  858.     move.l    (a0)+,d2
  859.     move.l    d2,6(a4)
  860.     tst.w    (a0)+
  861.     beq.s    pr_playsosample5
  862.     move.l    d2,36(a4)
  863.     move.l    d2,40(a4)
  864. pr_playsosample5:
  865.     move.w    (a0)+,10(a4)
  866.     bra.w    pr_playsonewperiod
  867. pr_playsonewperiod:
  868.     subq.w    #1,d1
  869.     add.b    d1,d1
  870.     move.w    (a4),d0
  871.     subq.b    #1,d0
  872.     lsl.w    #5,d0
  873.     move.l    (a1,d0.w),a1
  874.     move.w    (a1,d1.w),2(a4)        ; Frequenz eintragen
  875. pr_playsononewperiod:
  876.     bra.b    pr_playeffect
  877.  
  878. * Kanal spielen mit TONE PORTAMENTO **********************************
  879.  
  880. pr_playtpchannel:
  881.     lea    pr_Sampleinfos(pc),a0
  882.     lea    (a0),a1
  883.     lea    SAMPLEFINETUNEOFFSET(a1),a1
  884.     tst.b    d0
  885.     beq.s    pr_playtpnonewsample    ; Irgendein Sample ?
  886.     move.w    d0,(a4)            ; Trage Samplenummer ein
  887.     subq.b    #1,d0
  888.     lsl.l    #5,d0
  889.     add.l    d0,a0
  890.     addq.l    #6,a0
  891.     move.w    (a0)+,12(a4)        ; Lautstärke eintragen
  892.     move.l    (a0)+,d2
  893.     move.l    d2,6(a4)        ; Repeatpoint eintragen
  894.     tst.w    (a0)+
  895.     beq.s    pr_playtpchannel2
  896.     move.l    d2,36(a4)
  897.     move.l    d2,40(a4)
  898. pr_playtpchannel2:
  899.     move.w    (a0)+,10(a4)        ; Repeatlength eintragen
  900. pr_playtpnonewsample:
  901.     tst.b    d1
  902.     beq.s    pr_playtpnonewperiod    ; Irgend ne neue Frequenz ?
  903. pr_playtpnewperiod:
  904.     move.w    2(a4),14(a4)
  905.     subq.w    #1,d1
  906.     add.b    d1,d1
  907.     move.w    (a4),d0
  908.     subq.b    #1,d0
  909.     lsl.w    #5,d0
  910.     move.l    (a1,d0.w),a1
  911.     move.w    (a1,d1.w),d2
  912.     move.w    d2,16(a4)        ; Frequenz eintragen
  913.     bra.s    pr_playtpallowed
  914. pr_playtpnonewperiod:
  915.     tst.w    16(a4)
  916.     bne.s    pr_playtpallowed
  917.     clr.w    14(a4)
  918.     clr.l    26(a4)
  919. pr_playtpallowed:
  920.     bra.w    pr_playeffect
  921.  
  922. pr_playeffect:
  923.     bsr.w    pr_checkfunkrepeat
  924.     moveq    #0,d0
  925.     move.b    4(a4),d0
  926.     add.b    d0,d0
  927.     lea    pr_normaleffectlist(pc),a0
  928.     move.w    (a0,d0.w),d0
  929.     jmp    (a0,d0.w)
  930. pr_playnoeffect:
  931.     rts
  932.  
  933. pr_normaleffectlist:
  934.     dc.w    pr_playnoeffect-pr_normaleffectlist        ; 0
  935.     dc.w    pr_playnoeffect-pr_normaleffectlist        ; 1
  936.     dc.w    pr_playnoeffect-pr_normaleffectlist        ; 2
  937.     dc.w    pr_preptoneportamento-pr_normaleffectlist    ; 3
  938.     dc.w    pr_prepvibrato-pr_normaleffectlist        ; 4
  939.     dc.w    pr_playnoeffect-pr_normaleffectlist        ; 5
  940.     dc.w    pr_prepvibandvolslide-pr_normaleffectlist    ; 6
  941.     dc.w    pr_preptremolo-pr_normaleffectlist        ; 7
  942.     dc.w    pr_playnoeffect-pr_normaleffectlist        ; 8
  943.     dc.w    pr_playnoeffect-pr_normaleffectlist        ; 9
  944.     dc.w    pr_playnoeffect-pr_normaleffectlist        ; A
  945.     dc.w    pr_jumptopattern-pr_normaleffectlist        ; B
  946.     dc.w    pr_newvolume-pr_normaleffectlist        ; C
  947.     dc.w    pr_patternbreak-pr_normaleffectlist        ; D
  948.     dc.w    pr_play_e_command-pr_normaleffectlist        ; E
  949.     dc.w    pr_newspeed-pr_normaleffectlist            ; F
  950.  
  951. pr_play_e_command:
  952.     moveq    #0,d0
  953.     move.b    5(a4),d0
  954.     lsr.b    #3,d0
  955.     bclr    #0,d0
  956.     lea    pr_e_commandeffectlist(pc),a0
  957.     move.w    (a0,d0.w),d0
  958.     jmp    (a0,d0.w)
  959.     
  960. pr_e_commandeffectlist:
  961.     dc.w    pr_setfilter-pr_e_commandeffectlist        ; 0
  962.     dc.w    pr_fineslideup-pr_e_commandeffectlist        ; 1
  963.     dc.w    pr_fineslidedown-pr_e_commandeffectlist        ; 2
  964.     dc.w    pr_setglissandocontrol-pr_e_commandeffectlist    ; 3
  965.     dc.w    pr_setvibratowaveform-pr_e_commandeffectlist    ; 4
  966.     dc.w    pr_playfinetune-pr_e_commandeffectlist        ; 5
  967.     dc.w    pr_jumptoloop-pr_e_commandeffectlist        ; 6
  968.     dc.w    pr_settremolowaveform-pr_e_commandeffectlist    ; 7
  969.     dc.w    pr_playnoeffect-pr_e_commandeffectlist        ; 8
  970.     dc.w    pr_prepretrignote-pr_e_commandeffectlist    ; 9
  971.     dc.w    pr_finevolumeslideup-pr_e_commandeffectlist    ; A
  972.     dc.w    pr_finevolumeslidedown-pr_e_commandeffectlist    ; B
  973.     dc.w    pr_prepnotecut-pr_e_commandeffectlist        ; C
  974.     dc.w    pr_prepnotedelay-pr_e_commandeffectlist        ; D
  975.     dc.w    pr_preppatterndelay-pr_e_commandeffectlist    ; E
  976.     dc.w    pr_prepfunkrepeat-pr_e_commandeffectlist    ; F
  977.  
  978. pr_preppatterndelay:
  979.     cmp.b    #1,pr_patterndelaytime-pr_framecounter+1(a2)
  980.     bge.s    pr_preppatterndelayend
  981.     moveq    #$f,d0
  982.     and.b    5(a4),d0
  983.     addq.b    #1,d0
  984.     move.b    d0,pr_patterndelaytime-pr_framecounter+1(a2)
  985. pr_preppatterndelayend:
  986.     rts
  987.  
  988. pr_setvibratowaveform:
  989.     moveq    #$f,d0
  990.     and.b    5(a4),d0
  991.     move.w    d0,50(a4)
  992.     rts
  993.  
  994. pr_settremolowaveform:
  995.     moveq    #$f,d0
  996.     and.b    5(a4),d0
  997.     move.w    d0,52(a4)
  998.     rts
  999.  
  1000. pr_setglissandocontrol:
  1001.     moveq    #$f,d0
  1002.     and.b    5(a4),d0
  1003.     move.w    d0,48(a4)
  1004.     rts
  1005.  
  1006. pr_playfinetune:
  1007.     moveq    #$f,d0
  1008.     and.b    5(a4),d0
  1009.     lsl.w    #2,d0
  1010.     lea    pr_fastperiodlist(pc),a0
  1011.     move.l    (a0,d0.w),a0
  1012.     moveq    #0,d1
  1013.     IFEQ    PACKEDSONGFORMAT-YES
  1014.     move.b    (a6),d1
  1015.     lsr.b    #1,d1
  1016.     ELSE
  1017.     move.b    1(a6),d1
  1018.     ENDC
  1019.     beq.s    pr_playfinetuneend
  1020.     subq.b    #1,d1
  1021.     add.w    d1,d1
  1022.     move.w    (a0,d1.w),2(a4)        ; Frequenz eintragen
  1023. pr_playfinetuneend:
  1024.     rts
  1025.     
  1026. pr_jumptoloop:
  1027.     moveq    #$f,d0
  1028.     and.b    5(a4),d0
  1029.     beq.s    pr_prepjumptoloop
  1030.     addq.b    #1,47(a4)
  1031.     cmp.b    47(a4),d0
  1032.     blt.s    pr_jumptoloopend
  1033.     moveq.l    #0,d0
  1034.     move.w    44(a4),d0
  1035.     move.w    d0,pr_Patternct-pr_framecounter(a2)
  1036.     move.l    pr_Patternpt(pc),a0
  1037.     move.l    (a0),d5
  1038.     IFEQ    PACKEDSONGFORMAT-YES
  1039.     moveq.l    #0,d0
  1040.     move.w    60(a4),d0
  1041.     ELSE
  1042.     lsl.l    #4,d0
  1043.     ENDC
  1044.     add.l    d0,d5
  1045.     move.l    d5,pr_Currentposition-pr_framecounter(a2)
  1046.     addq.w    #1,pr_dontcalcnewposition-pr_framecounter(a2)
  1047.     rts
  1048. pr_jumptoloopend:
  1049.     clr.w    46(a4)
  1050.     rts
  1051. pr_prepjumptoloop:
  1052.     tst.w    46(a4)
  1053.     bne.s    pr_prepjumptoloopend
  1054.     move.w    pr_Patternct-pr_framecounter(a2),44(a4)
  1055.     IFEQ    PACKEDSONGFORMAT-YES
  1056.     move.l    pr_Currentposition(pc),d0
  1057.     move.l    pr_Patternpt(pc),a1
  1058.     sub.l    (a1),d0
  1059.     move.w    d0,60(a4)
  1060.     ENDC
  1061.     clr.w    46(a4)
  1062. pr_prepjumptoloopend:
  1063.     rts
  1064.  
  1065. pr_prepnotedelay:
  1066.     IFEQ    PACKEDSONGFORMAT-YES
  1067.     tst.b    57(a4)
  1068.     ELSE
  1069.     tst.b    1(a6)
  1070.     ENDC
  1071.     beq.s    pr_prepnotedelayend2
  1072.  
  1073.     moveq    #$f,d0
  1074.     and.b    5(a4),d0
  1075.     bne.s    pr_prepnotedelay2
  1076.     move.w    #$fff,18(a4)
  1077.     bra.w    pr_checknotedelay2
  1078. pr_prepnotedelay2:
  1079.     move.w    d7,d0
  1080.     not.b    d0
  1081.     and.b    d0,pr_dmacon-pr_framecounter+1(a2)
  1082.     clr.w    18(a4)
  1083.     rts
  1084. pr_prepnotedelayend2:
  1085.     move.w    #$fff,18(a4)
  1086.     rts
  1087.  
  1088. pr_prepretrignote:
  1089.     clr.w    18(a4)
  1090.     IFEQ    PACKEDSONGFORMAT-YES
  1091.     tst.b    56(a4)
  1092.     ELSE
  1093.     tst.w    (a6)
  1094.     ENDC
  1095.     bne.s    pr_prepretrignoteend
  1096.     bra.w    pr_checkretrignote2    
  1097. pr_prepretrignoteend:
  1098.     rts
  1099.  
  1100. pr_prepnotecut:
  1101.     clr.w    18(a4)
  1102.     moveq    #$f,d0
  1103.     and.b    5(a4),d0
  1104.     tst.b    d0
  1105.     bne.s    pr_prepnotecutend
  1106.     clr.w    12(a4)
  1107. pr_prepnotecutend:
  1108.     rts
  1109.     
  1110. pr_finevolumeslideup:
  1111.     moveq    #$f,d0
  1112.     and.b    5(a4),d0
  1113.     move.w    12(a4),d1
  1114.     add.w    d0,d1
  1115.     moveq    #64,d0
  1116.     cmp.w    d0,d1
  1117.     bls.s    pr_finevolumeslideup2
  1118.     move.w    d0,d1
  1119. pr_finevolumeslideup2:
  1120.     move.w    d1,12(a4)
  1121.     rts
  1122.  
  1123. pr_finevolumeslidedown:
  1124.     moveq    #$f,d0
  1125.     and.b    5(a4),d0
  1126.     move.w    12(a4),d1
  1127.     sub.w    d0,d1
  1128.     bpl.s    pr_finevolumeslidedown2
  1129.     moveq    #0,d1
  1130. pr_finevolumeslidedown2:
  1131.     move.w    d1,12(a4)
  1132.     rts
  1133.  
  1134. pr_fineslideup:
  1135.     moveq    #$f,d0
  1136.     and.b    5(a4),d0
  1137.     move.w    2(a4),d1
  1138.     sub.w    d0,d1
  1139.     cmp.w    #108,d1
  1140.     bge.s    pr_fineslideup2
  1141.     move.w    #108,d1
  1142. pr_fineslideup2:
  1143.     move.w    d1,2(a4)
  1144.     rts
  1145.  
  1146. pr_fineslidedown:
  1147.     moveq    #$f,d0
  1148.     and.b    5(a4),d0
  1149.     move.w    2(a4),d1
  1150.     add.w    d0,d1
  1151.     cmp.w    #907,d1
  1152.     bls.s    pr_fineslidedown2
  1153.     move.w    #907,d1
  1154. pr_fineslidedown2:
  1155.     move.w    d1,2(a4)
  1156.     rts
  1157.  
  1158. pr_setfilter:
  1159.     btst    #0,5(a4)
  1160.     beq.s    pr_setfilteron
  1161. pr_setfilteroff:
  1162.     bset    #1,$bfe001
  1163.     rts
  1164. pr_setfilteron:
  1165.     bclr    #1,$bfe001
  1166.     rts
  1167.  
  1168. pr_prepvibandvolslide:
  1169.     cmp.b    #1,pr_speed-pr_framecounter+1(a2)
  1170.     beq.s    pr_prepvibandvolslide2
  1171.     IFEQ    PACKEDSONGFORMAT-YES
  1172.     move.b    (a6),d1
  1173.     lsr.b    #1,d1
  1174.     ELSE
  1175.     tst.b    1(a6)
  1176.     ENDC
  1177.     beq.s    pr_prepvibandvolslide2
  1178.     clr.w    18(a4)
  1179. pr_prepvibandvolslide2:
  1180.     rts
  1181.  
  1182. pr_preptoneportamento:
  1183.     tst.b    5(a4)
  1184.     beq.s    pr_preptoneportamento2
  1185.     move.w    4(a4),22(a4)
  1186. pr_preptoneportamento2:
  1187.     rts
  1188.  
  1189. pr_prepvibrato:
  1190.     cmp.b    #1,pr_speed-pr_framecounter+1(a2)
  1191.     beq.s    pr_prepvibrato2
  1192.     IFEQ    PACKEDSONGFORMAT-YES
  1193.     move.b    (a6),d1
  1194.     lsr.b    #1,d1
  1195.     ELSE
  1196.     tst.b    1(a6)
  1197.     ENDC
  1198.     beq.s    pr_prepvibrato0
  1199.     clr.w    18(a4)
  1200. pr_prepvibrato0:
  1201.     move.b    5(a4),d0
  1202.     move.b    d0,d1
  1203.     lsr.b    #4,d1
  1204.     beq.s    pr_prepvibrato1
  1205.     move.b    d1,24(a4)
  1206. pr_prepvibrato1:
  1207.     and.b    #$f,d0
  1208.     beq.s    pr_prepvibrato2
  1209.     move.b    d0,25(a4)
  1210. pr_prepvibrato2:
  1211.     rts
  1212.  
  1213. pr_preptremolo:
  1214.     cmp.b    #1,pr_speed-pr_framecounter+1(a2)
  1215.     beq.s    pr_preptremolo2
  1216.     IFEQ    PACKEDSONGFORMAT-YES
  1217.     move.b    (a6),d1
  1218.     lsr.b    #1,d1
  1219.     ELSE
  1220.     tst.b    1(a6)
  1221.     ENDC
  1222.     beq.s    pr_preptremolo0
  1223.     clr.w    18(a4)
  1224. pr_preptremolo0:
  1225.     move.w    12(a4),20(a4)
  1226.     move.b    5(a4),d0
  1227.     move.b    d0,d1
  1228.     lsr.b    #4,d1
  1229.     beq.s    pr_preptremolo1
  1230.     move.b    d1,30(a4)
  1231. pr_preptremolo1:
  1232.     and.b    #$f,d0
  1233.     beq.s    pr_preptremolo2
  1234.     move.b    d0,31(a4)
  1235. pr_preptremolo2:
  1236.     rts
  1237.  
  1238. pr_newvolume:
  1239.     move.b    5(a4),d0
  1240.     cmp.b    #64,d0
  1241.     bls.s    pr_newvolumeend
  1242.     moveq    #64,d0
  1243. pr_newvolumeend:
  1244.     move.b    d0,13(a4)
  1245.     rts
  1246.  
  1247. pr_newspeed:
  1248.     move.b    5(a4),d0
  1249.     tst.b    d0
  1250.     bne.s    pr_newspeed2
  1251.     moveq    #1,d0
  1252. pr_newspeed2:
  1253.     move.b    d0,pr_speed-pr_framecounter+1(a2)
  1254.     rts
  1255.  
  1256. pr_patternbreak:
  1257.     moveq    #0,d0
  1258.     move.b    5(a4),d0
  1259.     add.w    #64,d0
  1260.     move.w    d0,pr_Patternct-pr_framecounter(a2)
  1261.     addq.w    #1,pr_patternhasbeenbreaked-pr_framecounter(a2)
  1262.     addq.w    #1,pr_dontcalcnewposition-pr_framecounter(a2)
  1263.     rts
  1264.         
  1265. pr_jumptopattern:
  1266.     moveq.l    #0,d0
  1267.     move.b    5(a4),d0
  1268.     subq.b    #1,d0
  1269.     bpl.s    pr_playjumptopattern2
  1270.     move.w    #128,d0
  1271. pr_playjumptopattern2:
  1272.     move.b    d0,pr_currentpattern-pr_framecounter+1(a2)
  1273.     lsl.l    #2,d0
  1274.     lea    pr_Patternpositions(pc),a0
  1275.     add.l    a0,d0
  1276.     move.l    d0,pr_Patternpt-pr_framecounter(a2)
  1277.     move.w    #64,pr_Patternct-pr_framecounter(a2)
  1278.     addq.w    #1,pr_patternhasbeenbreaked-pr_framecounter(a2)
  1279.     addq.w    #1,pr_dontcalcnewposition-pr_framecounter(a2)
  1280.     rts
  1281.  
  1282. * Control FX every frame **********************************************
  1283.  
  1284. pr_checkeffects:
  1285.     moveq    #1,d7
  1286.     lea    $a0(a5),a3
  1287.     lea    pr_Channel0(pc),a4
  1288.     move.w    12(a4),54(a4)
  1289.     pr_checkchannel
  1290.     IFEQ    INCLUDEFADINGROUTINE-YES
  1291.     move.w    54(a4),d0
  1292.     mulu.w    pr_musicfadect-pr_framecounter(a2),d0
  1293.     lsr.l    #FADINGSTEPS,d0
  1294.     move.w    d0,8(a3)
  1295.     ELSE
  1296.     move.w    54(a4),8(a3)
  1297.     ENDC
  1298.     
  1299.     moveq    #2,d7
  1300.     lea    $b0(a5),a3
  1301.     lea    pr_Channel1(pc),a4
  1302.     move.w    12(a4),54(a4)
  1303.     pr_checkchannel
  1304.     IFEQ    INCLUDEFADINGROUTINE-YES
  1305.     move.w    54(a4),d0
  1306.     mulu.w    pr_musicfadect-pr_framecounter(a2),d0
  1307.     lsr.l    #FADINGSTEPS,d0
  1308.     move.w    d0,8(a3)
  1309.     ELSE
  1310.     move.w    54(a4),8(a3)
  1311.     ENDC
  1312.  
  1313.     moveq    #4,d7
  1314.     lea    $c0(a5),a3
  1315.     lea    pr_Channel2(pc),a4
  1316.     move.w    12(a4),54(a4)
  1317.     pr_checkchannel
  1318.     IFEQ    INCLUDEFADINGROUTINE-YES
  1319.     move.w    54(a4),d0
  1320.     mulu.w    pr_musicfadect-pr_framecounter(a2),d0
  1321.     lsr.l    #FADINGSTEPS,d0
  1322.     move.w    d0,8(a3)
  1323.     ELSE
  1324.     move.w    54(a4),8(a3)
  1325.     ENDC
  1326.  
  1327.     moveq    #8,d7
  1328.     lea    $d0(a5),a3
  1329.     lea    pr_Channel3(pc),a4
  1330.     move.w    12(a4),54(a4)
  1331.     pr_checkchannel
  1332.     IFEQ    INCLUDEFADINGROUTINE-YES
  1333.     move.w    54(a4),d0
  1334.     mulu.w    pr_musicfadect-pr_framecounter(a2),d0
  1335.     lsr.l    #FADINGSTEPS,d0
  1336.     move.w    d0,8(a3)
  1337.     ELSE
  1338.     move.w    54(a4),8(a3)
  1339.     ENDC
  1340.  
  1341.     lea    pr_int(pc),a0
  1342.     move.l    pr_Vectorbasept(pc),a1
  1343.     move.l    a0,$78(a1)
  1344.     move.b    #$19,$bfde00
  1345.     rts
  1346.  
  1347. ***********************************************************************
  1348.  
  1349. pr_checknotchannel:
  1350.     rts
  1351.  
  1352. pr_check_e_commands
  1353.     moveq    #0,d0
  1354.     move.b    5(a4),d0
  1355.     lsr.b    #3,d0
  1356.     bclr    #0,d0
  1357.     lea    pr_E_Command_checklist(pc),a0
  1358.     move.w    (a0,d0.w),d0
  1359.     jmp    (a0,d0.w)
  1360.     
  1361. pr_Effectchecklist:
  1362.     dc.w    pr_checkarpeggio-pr_Effectchecklist        ; 0
  1363.     dc.w    pr_checkperiodslideup-pr_Effectchecklist    ; 1
  1364.     dc.w    pr_checkperiodslidedown-pr_Effectchecklist    ; 2
  1365.     dc.w    pr_checktoneportamento-pr_Effectchecklist    ; 3
  1366.     dc.w    pr_checkvibrato-pr_Effectchecklist        ; 4
  1367.     dc.w    pr_checktpandvolslide-pr_Effectchecklist    ; 5
  1368.     dc.w    pr_checkvibandvolslide-pr_Effectchecklist    ; 6
  1369.     dc.w    pr_checktremolo-pr_Effectchecklist        ; 7
  1370.     dc.w    pr_checknotchannel-pr_Effectchecklist        ; 8
  1371.     dc.w    pr_checknotchannel-pr_Effectchecklist        ; 9
  1372.     dc.w    pr_checkvolumeslide-pr_Effectchecklist        ; A
  1373.     dc.w    pr_checknotchannel-pr_Effectchecklist        ; B
  1374.     dc.w    pr_checknotchannel-pr_Effectchecklist        ; C
  1375.     dc.w    pr_checknotchannel-pr_Effectchecklist        ; D
  1376.     dc.w    pr_check_e_commands-pr_Effectchecklist        ; E
  1377.     dc.w    pr_checknotchannel-pr_Effectchecklist        ; F
  1378.  
  1379. pr_E_Command_checklist:
  1380.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 0
  1381.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 1
  1382.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 2
  1383.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 3
  1384.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 4
  1385.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 5
  1386.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 6
  1387.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 7
  1388.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 8
  1389.     dc.w    pr_checkretrignote-pr_E_Command_checklist    ; 9
  1390.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; A
  1391.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; B
  1392.     dc.w    pr_checknotecut-pr_E_Command_checklist        ; C
  1393.     dc.w    pr_checknotedelay-pr_E_Command_checklist    ; D
  1394.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; E
  1395.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; F
  1396.  
  1397. pr_prepfunkrepeat:
  1398.     moveq    #$f,d0
  1399.     and.b    5(a4),d0
  1400.     move.b    d0,33(a4)
  1401.     tst.b    d0
  1402.     bne.s    pr_checkfunkrepeat
  1403.     rts
  1404. pr_checkfunkrepeat:
  1405.     move.w    32(a4),d0
  1406.     beq.s    pr_checkfunkrepeatend
  1407.     lea    pr_FunkTable(pc),a0
  1408.     move.b    (a0,d0.w),d0
  1409.     move.b    35(a4),d1
  1410.     add.b    d0,d1
  1411.     bmi.s    pr_checkfunkrepeat2
  1412.     move.b    d1,35(a4)
  1413.     rts
  1414. pr_checkfunkrepeat2:
  1415.     clr.b    35(a4)
  1416.  
  1417.     move.l    36(a4),d0
  1418.     beq.s    pr_checkfunkrepeatend
  1419.     move.l    d0,d2
  1420.     moveq.l    #0,d1
  1421.     move.w    10(a4),d1
  1422.     add.l    d1,d0
  1423.     add.l    d1,d0
  1424.     move.l    40(a4),a0
  1425.     addq.l    #1,a0
  1426.     cmp.l    d0,a0
  1427.     blo.s    pr_checkfunkrepeatok
  1428.     move.l    d2,a0
  1429. pr_checkfunkrepeatok:
  1430.     move.l    a0,40(a4)
  1431.     moveq    #-1,d0
  1432.     sub.b    (a0),d0
  1433.     move.b    d0,(a0)
  1434. pr_checkfunkrepeatend:
  1435.     rts
  1436.  
  1437. pr_checknotedelay:
  1438.     move.w    18(a4),d1
  1439.     addq.w    #1,d1
  1440.     cmp.w    d0,d1
  1441.     bne.s    pr_checknotedelayend
  1442. pr_checknotedelay2:
  1443.     move.w    d7,$96(a5)
  1444.     or.w    d7,pr_dmacon-pr_framecounter(a2)
  1445.     moveq.l    #0,d0
  1446.     move.w    (a4),d0
  1447.     subq.w    #1,d0
  1448.     lsl.w    #5,d0
  1449.     lea    pr_Sampleinfos(pc),a0
  1450.     add.l    d0,a0
  1451.     move.w    2(a4),6(a3)
  1452.     move.l    (a0)+,(a3)        ; Setze Samplestart
  1453.     move.w    (a0)+,4(a3)        ; Setze Audiodatenlänge
  1454.     addq.l    #2,a0
  1455.     move.l    (a0)+,d2
  1456.     move.l    d2,6(a4)        ; Samplerepeatpoint eintragen
  1457.     tst.w    (a0)+
  1458.     beq.s    pr_checknotedelay3
  1459.     move.l    d2,36(a4)
  1460.     move.l    d2,40(a4)
  1461. pr_checknotedelay3:
  1462.     move.w    (a0)+,10(a4)        ; Samplerepeatlength eintragen
  1463. pr_checknotedelayend:
  1464.     move.w    d1,18(a4)
  1465.     rts
  1466.  
  1467. pr_checkretrignote:
  1468.     moveq    #$f,d0
  1469.     and.b    5(a4),d0
  1470.     move.w    18(a4),d1
  1471.     addq.w    #1,d1
  1472.     cmp.w    d0,d1
  1473.     bne.s    pr_checkretrignoteend
  1474. pr_checkretrignote2:
  1475.     moveq    #0,d1
  1476.     move.w    d7,$96(a5)
  1477.     or.w    d7,pr_dmacon-pr_framecounter(a2)
  1478.     move.w    (a4),d0
  1479.     subq.w    #1,d0
  1480.     lsl.w    #5,d0
  1481.     lea    pr_Sampleinfos(pc),a0
  1482.     move.l    (a0,d0.w),(a3)
  1483.     move.w    4(a0,d0.w),4(a3)
  1484. pr_checkretrignoteend:
  1485.     move.w    d1,18(a4)
  1486.     rts
  1487.  
  1488. pr_checknotecut:
  1489.     moveq    #$f,d0
  1490.     and.b    5(a4),d0
  1491.     addq.w    #1,18(a4)
  1492.     move.w    18(a4),d1
  1493.     cmp.w    d0,d1
  1494.     blt.s    pr_checknotecutend
  1495.     clr.w    12(a4)
  1496.     clr.w    54(a4)
  1497. pr_checknotecutend:
  1498.     rts
  1499.  
  1500. pr_checkarpeggio:
  1501.     tst.b    5(a4)
  1502.     bne.s    pr_checkarpeggio0
  1503.     rts
  1504. pr_checkarpeggio0:
  1505.     move.w    (a2),d0
  1506.     lea    pr_Arpeggiofastdivisionlist(pc),a1
  1507.     move.b    (a1,d0.w),d0
  1508.     beq.s    pr_checkarpeggio2
  1509.     cmp.b    #2,d0
  1510.     beq.s    pr_checkarpeggio1
  1511.     moveq    #0,d0
  1512.     move.b    5(a4),d0
  1513.     lsr.b    #4,d0
  1514.     bra.s    pr_checkarpeggio3
  1515. pr_checkarpeggio2:
  1516.     move.w    2(a4),6(a3)
  1517.     rts
  1518. pr_checkarpeggio1:
  1519.     moveq    #$f,d0
  1520.     and.b    5(a4),d0
  1521. pr_checkarpeggio3:
  1522.     asl.w    #1,d0
  1523.     move.w    (a4),d1
  1524.     lsl.w    #5,d1
  1525.     lea    pr_Sampleinfos+SAMPLEFINETUNEOFFSET(pc),a0
  1526.     move.l    (a0,d1.w),a0
  1527.     move.w    2(a4),d1
  1528.     lea    pr_Arpeggiofastlist(pc),a1
  1529.     moveq.l    #0,d2
  1530.     move.b    (a1,d1.w),d2
  1531.     add.b    d2,d2
  1532.     add.l    d2,a0
  1533.     moveq    #36,d7
  1534. pr_checkarpeggioloop:
  1535.     cmp.w    (a0)+,d1
  1536.     bhs.s    pr_checkarpeggio4
  1537.     dbf    d7,pr_checkarpeggioloop
  1538.     rts
  1539. pr_checkarpeggio4:
  1540.     subq.l    #2,a0
  1541.     move.w    (a0,d0.w),6(a3)
  1542.     rts
  1543.  
  1544. pr_checktpandvolslide:
  1545.     bsr.w    pr_checkvolumeslide
  1546.     moveq    #0,d2
  1547.     move.b    23(a4),d2
  1548.     move.w    26(a4),d0
  1549.     move.w    28(a4),d1
  1550.     bsr.s    pr_checktoneportamento2
  1551.     move.w    14(a4),26(a4)
  1552.     rts
  1553.     
  1554. pr_checktoneportamento:
  1555.     moveq    #0,d2
  1556.     move.b    5(a4),d2
  1557.     bne.s    pr_checktoneportamento1
  1558.     move.b    23(a4),d2
  1559. pr_checktoneportamento1:
  1560.     move.w    14(a4),d0
  1561.     move.w    16(a4),d1
  1562. pr_checktoneportamento2:
  1563.     cmp.w    d0,d1
  1564.     bgt.s    pr_checktoneportamentoplus
  1565.     blt.s    pr_checktoneportamentominus
  1566.     cmp.w    #1,(a2)
  1567.     beq.s    pr_savetpvalues
  1568.     rts
  1569. pr_checktoneportamentoplus:
  1570.     add.w    d2,d0
  1571.     cmp.w    d0,d1
  1572.     bgt.s    pr_checktoneportamentoend
  1573.     move.w    d1,d0
  1574.     move.w    d1,14(a4)
  1575.     move.w    d1,2(a4)
  1576.     tst.w    48(a4)
  1577.     bne.s    pr_checktoneportamentoglissando
  1578.     move.w    d1,6(a3)
  1579.     cmp.w    #1,(a2)
  1580.     beq.s    pr_savetpvalues
  1581.     rts
  1582. pr_checktoneportamentominus:
  1583.     sub.w    d2,d0
  1584.     cmp.w    d0,d1
  1585.     blt.s    pr_checktoneportamentoend
  1586.     move.w    d1,d0
  1587.     move.w    d1,14(a4)
  1588.     move.w    d1,2(a4)
  1589.     tst.w    48(a4)
  1590.     bne.s    pr_checktoneportamentoglissando
  1591.     move.w    d1,6(a3)
  1592.     cmp.w    #1,(a2)
  1593.     beq.s    pr_savetpvalues
  1594.     rts
  1595. pr_checktoneportamentoend:
  1596.     move.w    d0,14(a4)
  1597.     move.w    d0,2(a4)
  1598.     tst.w    48(a4)
  1599.     bne.s    pr_checktoneportamentoglissando
  1600.     move.w    d0,6(a3)
  1601.     cmp.w    #1,(a2)
  1602.     beq.s    pr_savetpvalues
  1603.     rts    
  1604. pr_savetpvalues:
  1605.     move.l    14(a4),26(a4)
  1606.     rts
  1607. pr_checktoneportamentoglissando:
  1608.     move.w    (a4),d1
  1609.     lsl.w    #5,d1
  1610.     lea    pr_Sampleinfos+SAMPLEFINETUNEOFFSET(pc),a0
  1611.     move.l    (a0,d1.w),a0
  1612.     lea    pr_Arpeggiofastlist(pc),a1
  1613.     moveq.l    #0,d2
  1614.     move.b    (a1,d0.w),d2
  1615.     add.w    d2,d2
  1616.     add.l    d2,a0
  1617.     moveq    #0,d3
  1618.     moveq    #36*2,d1
  1619. pr_chktoneportamentoglissandoloop:
  1620.     cmp.w    (a0,d3.w),d0
  1621.     bhs.s    pr_checktoneportamentoglissando2
  1622.     addq.w    #2,d3
  1623.     cmp.w    d1,d3
  1624.     blo.s    pr_chktoneportamentoglissandoloop
  1625.     moveq    #35*2,d3
  1626. pr_checktoneportamentoglissando2:
  1627.     move.w    (a0,d3.w),6(a3)
  1628.     cmp.w    #1,(a2)
  1629.     beq.s    pr_savetpvalues
  1630.     rts
  1631.  
  1632. pr_checkvolumeslide:
  1633.     moveq    #0,d0
  1634.     move.b    5(a4),d0
  1635.     move.w    d0,d1
  1636.     lsr.b    #4,d1
  1637.     beq.s    pr_checkvolumeslidedown
  1638.     move.w    12(a4),d2
  1639.     add.w    d1,d2
  1640.     bmi.s    pr_checkvolumeslide0
  1641.     moveq    #64,d0
  1642.     cmp.w    d0,d2
  1643.     bgt.s    pr_checkvolumeslide64
  1644.     move.w    d2,12(a4)
  1645.     move.w    d2,54(a4)
  1646.     rts
  1647. pr_checkvolumeslidedown:    
  1648.     and.b    #$f,d0
  1649.     move.w    12(a4),d2
  1650.     sub.w    d0,d2
  1651.     bmi.s    pr_checkvolumeslide0
  1652.     moveq    #64,d0
  1653.     cmp.w    d0,d2
  1654.     bgt.s    pr_checkvolumeslide64
  1655.     move.w    d2,12(a4)
  1656.     move.w    d2,54(a4)
  1657.     rts
  1658. pr_checkvolumeslide64:
  1659.     move.w    d0,12(a4)
  1660.     move.w    d0,54(a4)
  1661.     rts
  1662. pr_checkvolumeslide0:
  1663.     clr.w    12(a4)
  1664.     clr.w    54(a4)
  1665.     rts
  1666.     
  1667. pr_checkperiodslidedown:
  1668.     moveq    #0,d0
  1669.     move.b    5(a4),d0
  1670.     add.w    d0,2(a4)
  1671.     cmp.w    #907,2(a4)
  1672.     bls.s    pr_checkperiodslidedown2
  1673.     move.w    #907,2(a4)
  1674. pr_checkperiodslidedown2:
  1675.     move.w    2(a4),6(a3)
  1676.     rts
  1677.  
  1678. pr_checkperiodslideup:
  1679.     moveq    #0,d0
  1680.     move.b    5(a4),d0
  1681.     sub.w    d0,2(a4)
  1682.     cmp.w    #108,2(a4)
  1683.     bge.s    pr_checkperiodslideup2
  1684.     move.w    #108,2(a4)
  1685. pr_checkperiodslideup2:
  1686.     move.w    2(a4),6(a3)
  1687.     rts
  1688.  
  1689. pr_checkvibandvolslide:
  1690.     bsr.w    pr_checkvolumeslide
  1691.     moveq.l    #0,d0
  1692.     moveq.l    #0,d1
  1693.     move.b    25(a4),d0
  1694.     move.b    24(a4),d1
  1695.     bra.s    pr_checkvibrato4
  1696.  
  1697. pr_checkvibrato:
  1698.     moveq.l    #0,d0
  1699.     moveq.l    #0,d1
  1700.     move.b    5(a4),d0    ; Tiefe
  1701. pr_checkvibrato2:
  1702.     move.w    d0,d1        ; Geschwindigkeit
  1703.     and.w    #$f,d0
  1704.     bne.s    pr_checkvibrato3
  1705.     move.b    25(a4),d0
  1706. pr_checkvibrato3:
  1707.     lsr.b    #4,d1
  1708.     bne.s    pr_checkvibrato4
  1709.     move.b    24(a4),d1
  1710. pr_checkvibrato4:
  1711.     move.w    18(a4),d2    ;Position
  1712.     lsr.w    #2,d2
  1713.     and.w    #$1f,d2
  1714.     move.w    50(a4),d3
  1715.     beq.s    pr_checkvibratosine
  1716.     btst    #0,d3
  1717.     bne.s    pr_checkvibratorampdown
  1718.     move.b    #255,d3
  1719.     bra.s    pr_checkvibratoset
  1720. pr_checkvibratorampdown:
  1721.     lsl.b    #3,d2
  1722.     tst.b    19(a4)
  1723.     bmi.s    pr_checkvibratorampdown2
  1724.     move.b    #255,d3
  1725.     sub.b    d2,d3
  1726.     bra.s    pr_checkvibratoset
  1727. pr_checkvibratorampdown2:
  1728.     move.b    d2,d3
  1729.     bra.s    pr_checkvibratoset
  1730. pr_checkvibratosine:
  1731.     lea    pr_VibratoTable(pc),a0
  1732.     moveq    #0,d3
  1733.     move.b    (a0,d2.w),d3
  1734. pr_checkvibratoset:
  1735.     mulu.w    d0,d3
  1736.     lsr.w    #7,d3
  1737.     move.w    2(a4),d2
  1738.     tst.b    19(a4)
  1739.     bpl.s    pr_checkvibratoneg
  1740.     add.w    d3,d2
  1741.     bra.s    pr_checkvibrato5
  1742. pr_checkvibratoneg:
  1743.     sub.w    d3,d2
  1744. pr_checkvibrato5:
  1745.     move.w    d2,6(a3)
  1746.     lsl.w    #2,d1
  1747.     add.b    d1,19(a4)
  1748.     rts
  1749.  
  1750. pr_checktremolo:
  1751.     moveq    #0,d0
  1752.     moveq.l    #0,d1
  1753.     move.b    5(a4),d0    ; Tiefe
  1754. pr_checktremolo2:
  1755.     move.w    d0,d1        ; Geschwindigkeit
  1756.     and.w    #$f,d0
  1757.     bne.s    pr_checktremolo3
  1758.     move.b    31(a4),d0
  1759. pr_checktremolo3:
  1760.     lsr.b    #4,d1
  1761.     bne.s    pr_checktremolo4
  1762.     move.b    30(a4),d1
  1763. pr_checktremolo4:
  1764.     move.w    18(a4),d2    ;Position
  1765.     lsr.w    #2,d2
  1766.     and.w    #$1f,d2
  1767.     move.w    52(a4),d3
  1768.     beq.s    pr_checktremolosine
  1769.     btst    #0,d3
  1770.     bne.s    pr_checktremolorampdown
  1771.     move.b    #255,d3
  1772.     bra.s    pr_checktremoloset
  1773. pr_checktremolorampdown:
  1774.     lsl.b    #3,d2
  1775.     tst.b    19(a4)
  1776.     bmi.s    pr_checktremolorampdown2
  1777.     move.b    #255,d3
  1778.     sub.b    d2,d3
  1779.     bra.s    pr_checktremoloset
  1780. pr_checktremolorampdown2:
  1781.     move.b    d2,d3
  1782.     bra.s    pr_checktremoloset
  1783. pr_checktremolosine:
  1784.     lea    pr_VibratoTable(pc),a0
  1785.     moveq    #0,d3
  1786.     move.b    (a0,d2.w),d3
  1787. pr_checktremoloset:
  1788.     mulu.w    d0,d3
  1789.     lsr.w    #6,d3
  1790.     move.w    20(a4),d2
  1791.     tst.b    19(a4)
  1792.     bpl.s    pr_checktremoloneg
  1793.     add.w    d3,d2
  1794.     moveq    #64,d4
  1795.     cmp.w    d4,d2
  1796.     bls.s    pr_checktremolo5
  1797.     move.w    d4,d2
  1798.     bra.s    pr_checktremolo5
  1799. pr_checktremoloneg:
  1800.     sub.w    d3,d2
  1801.     bpl.s    pr_checktremolo5
  1802.     moveq    #0,d2
  1803. pr_checktremolo5:
  1804.     move.w    d2,54(a4)
  1805.     lsl.w    #2,d1
  1806.     add.b    d1,19(a4)
  1807.     rts
  1808.  
  1809. pr_VibratoTable:    
  1810.     dc.b    0,24,49,74,97,120,141,161
  1811.     dc.b    180,197,212,224,235,244,250,253
  1812.     dc.b    255,253,250,244,235,224,212,197
  1813.     dc.b    180,161,141,120,97,74,49,24
  1814. pr_FunkTable:
  1815.     dc.b    0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1816.     
  1817. * Variables ***********************************************************
  1818.  
  1819. pr_module:            dc.l    0
  1820. pr_startposition:        dc.w    0
  1821. pr_speed:            dc.w    6
  1822. pr_highestpattern:        dc.w    0
  1823. pr_currentpattern:        dc.w    0
  1824. pr_framecounter:        dc.w    0
  1825. pr_patterndelaytime:        dc.w    0
  1826. pr_patternhasbeenbreaked:    dc.w    0
  1827. pr_Patternpositions:        ds.l    128
  1828. pr_Patternpt:            dc.l    0
  1829. pr_Currentposition:        dc.l    0
  1830. pr_Patternct:            dc.w    0
  1831. pr_oldledvalue:            dc.w    0
  1832. pr_dontcalcnewposition:        dc.w    0
  1833. pr_commandnotedelay:        dc.w    0
  1834. pr_old78:            dc.l    0
  1835. pr_Vectorbasept:        dc.l    0
  1836. pr_Channel0:            dc.w    1
  1837.                 ds.w    30
  1838. pr_Channel1:            dc.w    1
  1839.                 ds.w    30
  1840. pr_Channel2:            dc.w    1
  1841.                 ds.w    30
  1842. pr_Channel3:            dc.w    1
  1843.                 ds.w    30
  1844. pr_dmacon:            dc.w    $8000
  1845.  
  1846. pr_Arpeggiofastlist:        ds.b    1000
  1847. pr_Arpeggiofastdivisionlist:    ds.b    $100
  1848. pr_fastperiodlist:        ds.l    16
  1849. pr_Sampleinfos:            ds.b    32*32
  1850.  
  1851. pr_periods:
  1852. ; Tuning 0, Normal
  1853.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1854.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1855.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1856. ; Tuning 1
  1857.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1858.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1859.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1860. ; Tuning 2
  1861.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1862.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1863.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1864. ; Tuning 3
  1865.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1866.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1867.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1868. ; Tuning 4
  1869.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1870.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1871.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1872. ; Tuning 5
  1873.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1874.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1875.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1876. ; Tuning 6
  1877.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1878.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1879.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1880. pr_Arpeggiofastlistperiods:
  1881. ; Tuning 7
  1882.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1883.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1884.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1885. ; Tuning -8
  1886.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1887.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1888.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1889. ; Tuning -7
  1890.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1891.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1892.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1893. ; Tuning -6
  1894.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1895.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1896.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1897. ; Tuning -5
  1898.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1899.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1900.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1901. ; Tuning -4
  1902.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1903.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1904.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1905. ; Tuning -3
  1906.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1907.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1908.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1909. ; Tuning -2
  1910.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1911.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1912.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1913. ; Tuning -1
  1914.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1915.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1916.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114